iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
生成式 AI

生成式AI輔助電子遊戲製作系列 第 27

D27 / 實作敵人的AI

  • 分享至 

  • xImage
  •  

昨天的AI已經列出幾種技能使用的策略,今天可以開始來實作了。但我不太知道要用什麼樣的架構寫,所以我先請ChatGPT給我幾個方向。

給我幾種適合寫這種ai的程式架構

當設計一個簡單的 AI 系統時,針對你提到的「基於規則的技能使用 AI」,有幾種常見的程式架構可以用來實現這種行為。這些架構可以幫助你保持代碼的結構清晰、擴展方便,同時讓 AI 的邏輯簡單明瞭。以下是幾種適合這類 AI 編寫的程式架構:

1. 條件判斷邏輯結構(If-Else Decision Structure)

這是最簡單且常見的 AI 編寫方式,適合簡單的 AI 行為。通過 if-elseswitch-case 來根據條件選擇合適的技能。

優點:

  • 易於實現,邏輯簡單。
  • 適合小型專案或不需要複雜決策的 AI 系統。

例子:

public class AIController : MonoBehaviour
{
    public Character aiCharacter;
    public Character player;

    void Update()
    {
        if (aiCharacter.Health < 20 && aiCharacter.Mana > 40)
        {
            // 使用治癒技能
            UseHeal();
        }
        else if (aiCharacter.Health < 30)
        {
            // 使用防禦技能
            UseShield();
        }
        else if (player.Health < 50 && aiCharacter.Mana > 30)
        {
            // 使用高傷害技能
            UsePowerStrike();
        }
        else
        {
            // 普通攻擊
            UseBasicAttack();
        }
    }

    void UseHeal() { /* Heal logic */ }
    void UseShield() { /* Shield logic */ }
    void UsePowerStrike() { /* Power Strike logic */ }
    void UseBasicAttack() { /* Basic Attack logic */ }
}

2. 狀態機(State Machine)

狀態機是一種適合處理不同狀態之間轉換的架構。AI 在不同的狀態(例如攻擊、防禦、恢復)之間進行切換,每個狀態都有不同的行為邏輯。

優點:

  • 使得代碼的邏輯清晰、結構化,每個狀態都有明確的責任。
  • 便於擴展新行為。

例子:

public enum AIState
{
    Attack,
    Defend,
    Heal
}

public class AIController : MonoBehaviour
{
    public Character aiCharacter;
    public Character player;
    private AIState currentState;

    void Start()
    {
        currentState = AIState.Attack; // 初始狀態為攻擊
    }

    void Update()
    {
        switch (currentState)
        {
            case AIState.Attack:
                if (player.Health < 50)
                {
                    UsePowerStrike();
                }
                else
                {
                    UseBasicAttack();
                }
                if (aiCharacter.Health < 30)
                {
                    currentState = AIState.Defend; // 切換到防禦狀態
                }
                break;

            case AIState.Defend:
                UseShield();
                if (aiCharacter.Health < 20)
                {
                    currentState = AIState.Heal; // 切換到治癒狀態
                }
                break;

            case AIState.Heal:
                UseHeal();
                if (aiCharacter.Health > 50)
                {
                    currentState = AIState.Attack; // 切換回攻擊狀態
                }
                break;
        }
    }

    void UseHeal() { /* Heal logic */ }
    void UseShield() { /* Shield logic */ }
    void UsePowerStrike() { /* Power Strike logic */ }
    void UseBasicAttack() { /* Basic Attack logic */ }
}

3. 行為樹(Behavior Tree)

行為樹是比狀態機更靈活的 AI 架構,使用樹狀結構來組織 AI 的行為決策。樹的每個節點代表一個行為,根據當前情況選擇執行的分支。

優點:

  • 可擴展性強,適合處理更複雜的 AI 行為。
  • 更靈活的行為選擇和組合方式,支持優先級和復雜邏輯。

例子:

public class AIController : MonoBehaviour
{
    public Character aiCharacter;
    public Character player;

    void Update()
    {
        // 行為樹的根節點
        if (aiCharacter.Health < 20 && aiCharacter.Mana > 40)
        {
            UseHeal(); // 假設治癒是優先級最高的行為
        }
        else if (aiCharacter.Health < 30)
        {
            UseShield(); // 如果AI快死了,則進行防禦
        }
        else
        {
            if (player.Health < 50 && aiCharacter.Mana > 30)
            {
                UsePowerStrike(); // 優先使用高傷害技能
            }
            else
            {
                UseBasicAttack(); // 否則進行普通攻擊
            }
        }
    }

    void UseHeal() { /* Heal logic */ }
    void UseShield() { /* Shield logic */ }
    void UsePowerStrike() { /* Power Strike logic */ }
    void UseBasicAttack() { /* Basic Attack logic */ }
}

4. 策略模式(Strategy Pattern)

策略模式允許你將不同的技能使用策略封裝在獨立的類中,AI 可以根據當前的情況選擇合適的策略來使用技能。

優點:

  • 將不同的行為邏輯分離出來,易於擴展和維護。
  • 允許不同的策略可以互換,靈活度高。

例子:

public interface ISkillStrategy
{
    void Execute(Character aiCharacter, Character player);
}

public class BasicAttackStrategy : ISkillStrategy
{
    public void Execute(Character aiCharacter, Character player)
    {
        // 實現普通攻擊邏輯
    }
}

public class PowerStrikeStrategy : ISkillStrategy
{
    public void Execute(Character aiCharacter, Character player)
    {
        // 實現高傷害攻擊邏輯
    }
}

public class AIController : MonoBehaviour
{
    private ISkillStrategy currentStrategy;
    public Character aiCharacter;
    public Character player;

    void Start()
    {
        currentStrategy = new BasicAttackStrategy(); // 初始策略
    }

    void Update()
    {
        if (aiCharacter.Health < 50 && aiCharacter.Mana > 30)
        {
            currentStrategy = new PowerStrikeStrategy(); // 切換策略
        }
        else
        {
            currentStrategy = new BasicAttackStrategy(); // 回到普通攻擊
        }

        // 執行當前策略
        currentStrategy.Execute(aiCharacter, player);
    }
}

5. 使用表驅動開發(Table-Driven Development)

這種方法允許你根據一個配置表來定義AI的行為和技能選擇。可以將AI的規則和邏輯放在一個數據表中,然後在遊戲中解析這些數據,讓AI做出行動決策。

優點:

  • 修改行為邏輯時只需要更新配置表,無需改變代碼。
  • 非常靈活,適合多樣化的AI行為需求。

例子:

public class AIController : MonoBehaviour
{
    public Character aiCharacter;
    public Character player;

    private Dictionary<string, string> skillTable = new Dictionary<string, string>
    {
        {"lowHealth", "Heal"},
        {"midHealth", "Shield"},
        {"highMana", "PowerStrike"},
        {"default", "BasicAttack"}
    };

    void Update()
    {
        if (aiCharacter.Health < 20)
        {
            UseSkill(skillTable["lowHealth"]);
        }
        else if (aiCharacter.Health < 50)
        {
            UseSkill(skillTable["midHealth"]);
        }
        else if (aiCharacter.Mana > 30)
        {
            UseSkill(skillTable["highMana"]);
        }
        else
        {
            UseSkill(skillTable["default"]);
        }
    }

    void UseSkill(string skill)
    {
        switch (skill)
        {
            case "Heal":
                // 使用治癒技能
                break;
            case "Shield":
                // 使用防禦技能
                break;
            case "PowerStrike":
                // 使用高傷害技能
                break;
            case "BasicAttack":
                // 使用普通攻擊
                break;
        }
    }
}

總結:

  • If-Else 結構:簡單易實現,適合小規模的AI邏輯。
  • 狀態機(State Machine):適合多種狀態之間切換的AI行為,清晰易擴展。
  • **行為樹(Behavior

上一篇
Day 26 /敵人AI在遊戲中的技能策略
下一篇
D28 /敵人角色及技能設計
系列文
生成式AI輔助電子遊戲製作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言